import type { AxiosRequestConfig, PageParam, PageResult } from '@vben/request';

import { requestClient } from '#/api/request';

/** Axios 上传进度事件 */
export type AxiosProgressEvent = AxiosRequestConfig['onUploadProgress'];

export namespace InfraFileApi {
  /** 文件信息 */
  export interface File {
    id?: number;
    configId?: number;
    ext?: string; // 扩展名
    filename?: string;
    originalFilename?: string;
    url?: string;
    thUrl?: string; // 缩略图url
    size?: number;
    type?: string;
    createTime?: Date;
    fileCategoriesCode?: string; // 文件分类编码
    objectId?: string; // 分类对象id
    objectType?: string; // 分类对象类型
    fileCategoriesName?: string; // 文件分类名称
  }

  /** 文件预签名地址 */
  export interface FilePresignedUrlRespVO {
    configId: number; // 文件配置编号
    uploadUrl: string; // 文件上传 URL
    url: string; // 文件 URL
    path: string; // 文件路径
  }
  /** 文件参数 */
  export interface FileUploadParams {
    fileCategoriesCode: string; // 文件分类编码
    objectId?: string; // 分类对象id
    objectType?: string; // 分类对象类型
    clientId?: string; // 上传应用id
    deptId?: number; // 上传的组织id
    creator?: string; // 上传人姓名id
    uploader?: string; // 上传人姓名
    filePassword?: string; // 文件加密密码
    zipPassword?: string; // 解压密码
    directory?: string; // 文件目录
    metadata?: Map<string, string>; // 元数据
    userMetadata?: Map<string, string>; // 文件用户元数据
    enableThumbnail?: boolean; // 是否生成缩略图
    thumbnailCreateType?: number; // 缩率图生成类型：1-自动生成，2-手动生成
    fileId?: number; // 手动生成缩略图对应的文件id
  }

  /** 上传文件 */
  export interface FileUploadReqVO {
    file: globalThis.File;
    params?: FileUploadParams;
  }
}

/** 查询文件列表 */
export function getFilePage(params: PageParam) {
  return requestClient.post<PageResult<InfraFileApi.File>>(
    '/infra/file/page',
    params,
  );
}

/** 删除文件 */
export function deleteFile(id: number, forceDelete?: boolean) {
  return requestClient.delete(
    `/infra/file/delete?id=${id}&forceDelete=${forceDelete}`,
  );
}

/** 批量删除文件 */
export function deleteFileList(ids: number[], forceDelete?: boolean) {
  return requestClient.delete(
    `/infra/file/delete-list?ids=${ids.join(',')}&forceDelete=${forceDelete}`,
  );
}

/** 获取文件预签名地址 */
export function getFilePresignedUrl(
  name: string,
  params?: InfraFileApi.FileUploadParams,
) {
  return requestClient.get<InfraFileApi.FilePresignedUrlRespVO>(
    '/infra/file/presigned-url',
    {
      params: { name, params },
    },
  );
}

/** 创建文件 */
export function createFile(data: InfraFileApi.File) {
  return requestClient.post('/infra/file/create', data);
}

/** 上传文件 */
export function uploadFile(
  data: InfraFileApi.FileUploadReqVO,
  onUploadProgress?: AxiosProgressEvent,
) {
  // 特殊：由于 upload 内部封装，即使 directory 为 undefined，也会传递给后端
  return requestClient.upload('/infra/file/upload', data, { onUploadProgress });
}
